home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2000 #5 / Amiga Plus CD - 2000 - No. 5.iso / Tools / Dev / GameboyDev / GBDK / lib / printf.c < prev    next >
C/C++ Source or Header  |  1999-03-29  |  1KB  |  72 lines

  1. #include <stdio.h>
  2. #include <stdarg.h>
  3.  
  4. BYTE printf(char *fmt, ...)
  5. {
  6.   va_list ap;
  7.   BYTE nb = 0;
  8.  
  9.   va_start(ap, fmt);
  10.   for(; *fmt; fmt++)
  11.     if(*fmt == '%') {
  12.       switch(*++fmt) {
  13.       case 'c':
  14.     /* char */
  15.     putchar(va_arg(ap, char));
  16.     break;
  17.       case 'd':
  18.     /* decimal int */
  19.     printn(va_arg(ap, BYTE), 10, SIGNED);
  20.     break;
  21.       case 'u':
  22.     /* unsigned int */
  23.     printn(va_arg(ap, BYTE), 10, UNSIGNED);
  24.     break;
  25.       case 'o':
  26.     /* octal int */
  27.     printn(va_arg(ap, BYTE), 8, UNSIGNED);
  28.     break;
  29.       case 'x':
  30.     /* hexadecimal int */
  31.     printn(va_arg(ap, BYTE), 16, UNSIGNED);
  32.     break;
  33.       case 's':
  34.     /* string */
  35.     print(va_arg(ap, char *));
  36.     break;
  37.       case 'l':
  38.     /* long */
  39.     switch(*++fmt) {
  40.     case 'd':
  41.       /* decimal long */
  42.       println(va_arg(ap, WORD), 10, SIGNED);
  43.       break;
  44.     case 'u':
  45.       /* unsigned long */
  46.       println(va_arg(ap, WORD), 10, UNSIGNED);
  47.       break;
  48.     case 'o':
  49.       /* octal long */
  50.       println(va_arg(ap, WORD), 8, UNSIGNED);
  51.       break;
  52.     case 'x':
  53.       /* hexadecimal long */
  54.       println(va_arg(ap, WORD), 16, UNSIGNED);
  55.       break;
  56.     }
  57.     break;
  58.       case '%':
  59.     /* % */
  60.     putchar(*fmt);
  61.     break;
  62.       default:
  63.     return -1;
  64.       }
  65.       nb++;
  66.     } else
  67.       putchar(*fmt);
  68.   va_end(ap);
  69.  
  70.   return nb;
  71. }
  72.